package main;

import main.function.CountDisplay;
import main.function.Display;
import main.function.IncreaseDisplay;
import main.function.RandomDisplay;
import main.impl.CharDisplayImpl;
import main.impl.FileDisplayImpl;
import main.impl.StringDisplayImpl;

/**
 * Display 类 和 CountDisplay 类 是类的功能层次结构，
 * 即 需要在 Display 类的基础上增加新功能 就编写一个类 CountDisplay 继承 Display，然后在 CountDisplay 中编写新方法
 *
 * DisplayImpl 类和 StringDisplayImpl 类 是类的实现层次结构
 * 即 DisplayImpl 定义了抽象方法，其子类 StringDisplayImpl 用于实现，不同的子类实现也不同
 *
 * 桥接模式（Bridge）
 * 即 在 Display 中保存一个 DisplayImpl 实例 impl 字段，用于将 类的功能层次结构 和 类的实现层次结构 连接起来；
 *      在调用 Display 的一些方法时，实际调用的是 DisplayImpl 的实现方法。
 *
 * 通过在 Display 中维护一个 impl 字段，是一种委托关系，属于弱关联关系；
 *      只有在 new 一个 Display 实例时，才会传入 DisplayImpl 的实例形成关联关系。
 *
 */
public class Main {

    public static void main(String[] args) {
//        Display d1 = new Display(new StringDisplayImpl("Hello"));
//        Display d2 = new CountDisplay(new StringDisplayImpl("World"));
//        CountDisplay d3 = new CountDisplay(new StringDisplayImpl("Welcome"));
//        d1.display();
//        d2.display();
//        d3.display();
//        d3.multiDisplay(5);
//
//        RandomDisplay d4 = new RandomDisplay(new StringDisplayImpl("Welcome"));
//        d4.randomDisplay(5);

//        CountDisplay d5 = new CountDisplay(new FileDisplayImpl("./demo09_bridge/info.txt"));
//        d5.multiDisplay(3);

        IncreaseDisplay d6 = new IncreaseDisplay(new CharDisplayImpl("<","*",">"),1);
        d6.increaseDisplay(4);
        System.out.println();
        IncreaseDisplay d7 = new IncreaseDisplay(new CharDisplayImpl("|","#","-"),2);
        d7.increaseDisplay(6);
    }

}
